package Persistencia;

import Complementos.Conexion_BD;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import Modelo.Paciente;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PacienteDAO {

    Conexion_BD co = new Conexion_BD();
    ResultSet rs = null;
    CallableStatement cs;

    public void agregarPaciente(Paciente nuevoPaciente) {
        /*
         * String query = "INSERT INTO `paciente`(`idPaciente`,
         * `idPERSONA`,`antecedentes`, `ocupacion`, `recomendadopor`,
         * `grupo`,`fechaingreso`, `IdUsuario`) VALUES ('"+
         * nuevoPaciente.getCodpaciente()+"','"+ nuevoPaciente.getCodpersona()+
         * "','"+ nuevoPaciente.getAntecedentes() +"','"+
         * nuevoPaciente.getOcupacion() +"','"+
         * nuevoPaciente.getRecomendado()+"','"+ nuevoPaciente.getGrupo()+"',"+
         * "STR_TO_DATE('"+nuevoPaciente.getFechaingreso()+"','%d,%m,%Y')"+
         * ",'"+ 5 +"')";
         *
         *
         * System.out.println(query); try { co.Conectar(); co.insupdel(query);
         * try { co.Desconectar(); } catch (Exception ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex); }
         *
         * } catch (ClassNotFoundException ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex); } catch (SQLException ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex); }          *
         *
         */

        try {
            co.Conectar();
            co.getCn().setAutoCommit(false);
            //Llamamos el Store Procedure 
            cs = co.getCn().prepareCall("{CALL usp_registrar_paciente(?,?,?,?,?,?,?)}");
            //Enviamos parametros al Store Procedure
            cs.setInt(1, nuevoPaciente.getCodpaciente());
            cs.setInt(2, nuevoPaciente.getCodpersona());
            cs.setString(3, nuevoPaciente.getAntecedentes());
            cs.setString(4, nuevoPaciente.getOcupacion());
            cs.setString(5, nuevoPaciente.getRecomendado());
            cs.setString(6, "" + nuevoPaciente.getGrupo());
            cs.setString(7, nuevoPaciente.getFechaingreso());

            //Ejecutamos el Store Procedure
            cs.executeUpdate();
            //Comiteamos
            co.getCn().commit();

            //String query = "execute sp_registrar_paciente " + "'" + paciente.getCodpaciente() + "'" + "," + "'" + paciente.getCodpersona() + "'" + "," + "'" + paciente.getAntecedentes() + "'" + "," + "'" + paciente.getOcupacion() + "'" + "," + "'" + paciente.getRecomendado() + "'" + "," + "'" + paciente.getGrupo() + "'" + "," + "'" + paciente.getFechaingreso() + "'";
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            try {
                co.getCn().rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex1);
            }
        } finally {
            try {
                co.getCn().setAutoCommit(true);
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PersonaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public boolean editarPaciente(Paciente paciente) {
        boolean modifico = false;
        try {
            co.Conectar();
            co.getCn().setAutoCommit(false);
            //Llamamos el Store Procedure 
            cs = co.getCn().prepareCall("{CALL usp_modificar_paciente(?,?,?,?,?,?)}");
            //Enviamos parametros al Store Procedure
            cs.setInt(1, paciente.getCodpaciente());
            cs.setString(2, paciente.getAntecedentes());
            cs.setString(3, paciente.getOcupacion());
            cs.setString(4, paciente.getRecomendado());
            cs.setString(5, "" + paciente.getGrupo());
            cs.setString(6, paciente.getFechaingreso());

            //Ejecutamos el Store Procedure
            cs.executeUpdate();
            //Comiteamos
            co.getCn().commit();
            modifico = true;
            return modifico;
            //String query = "execute sp_registrar_paciente " + "'" + paciente.getCodpaciente() + "'" + "," + "'" + paciente.getCodpersona() + "'" + "," + "'" + paciente.getAntecedentes() + "'" + "," + "'" + paciente.getOcupacion() + "'" + "," + "'" + paciente.getRecomendado() + "'" + "," + "'" + paciente.getGrupo() + "'" + "," + "'" + paciente.getFechaingreso() + "'";
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            try {
                co.getCn().rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex1);
            }
        } finally {
            try {
                co.getCn().setAutoCommit(true);
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PersonaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        /*
         * try {
         *
         * co.Conectar(); //String query = "execute sp_modificar_paciente '" +
         * paciente.getCodpaciente() +"'" + "," + "'" + paciente.getNombres() +
         * "'" + "," + "'" + paciente.getApellidos() + "'" + "," + "'" +
         * paciente.getDni() + "'" + "," + "'" + paciente.getNacionalidad() +
         * "'" + "," + "'" + paciente.getDireccion() + "'" + "," + "'" +
         * paciente.getDistrito() + "'" + "," + "'" + paciente.getProvincia() +
         * "'" + "," + "'" + paciente.getDepartamento() + "'" + "," + "'" +
         * paciente.getEmail() + "'" + "," + "'" + paciente.getTelefono() + "'"
         * + "," + "'" + paciente.getCelular() + "'" + "," + "'" +
         * paciente.getFechanac() + "'" + "," + "'" + paciente.getEdad() + "'" +
         * "," + "'" + paciente.getAntecedentes() + "'" + "," + "'" +
         * paciente.getOcupacion() + "'" + "," + "'" + paciente.getRecomendado()
         * + "'" + "," + "'" + paciente.getGenero() + "'" + "," + "'" +
         * paciente.getGrupo() + "'" + "," + "'" + paciente.getFechaingreso() +
         * "'";
         *
         * String query = "execute sp_modificar_paciente " +
         * paciente.getCodpaciente() + "," + "'" + paciente.getAntecedentes() +
         * "','" + paciente.getOcupacion() + "','" + paciente.getRecomendado() +
         * "','" + paciente.getGrupo() + "','" + paciente.getFechaingreso() +
         * "'"; System.out.println("" + query); //UPDATE PACIENTE SET
         * antecedentes = @antecedentes, ocupacion = @ocupacion, recomendadopor
         * = @recomendado, grupo = @grupo , fechaingreso = @fechaingreso where
         * id = @codpaciente;
         *
         * co.insupdel(query); modifico = true; return modifico; } catch
         * (ClassNotFoundException ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex); } catch (SQLException ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex); JOptionPane.showMessageDialog(null, ex.getMessage()); }
         *
         * try { co.Desconectar(); } catch (Exception ex) {
         * Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null,
         * ex);
        }
         */

        return modifico;

    }

    public ArrayList<ArrayList> listarTodos(int opcion, String busqueda) {

        ArrayList<ArrayList> v = new ArrayList<ArrayList>();
        try {

            co.Conectar();
            switch (opcion) {
                case 0:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidoPaterno,per.apellidoMaterno,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where pac.idPaciente =" + Integer.parseInt(busqueda) + " and per.idpersona = pac.idpersona");

                    break;
                case 1:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidoPaterno,per.apellidoMaterno,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where per.nombres  like '%" + busqueda + "%' and per.idpersona = pac.idpersona");
                    break;
                case 2:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidoPaterno,per.apellidoMaterno,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where per.apellidoPaterno like  '%" + busqueda + "%' and per.idpersona = pac.idpersona");
                    break;
                case 3:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidoPaterno,per.apellidoMaterno,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where per.apellidoMaterno like  '%" + busqueda + "%' and per.idpersona = pac.idpersona");
                    break;
                case 4:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidoPaterno,per.apellidoMaterno,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where per.dni =  '" + busqueda + "' and per.idpersona = pac.idpersona");
                    break;
            }

            if (rs.first()) {
                while (!rs.isAfterLast()) {
                    ArrayList registro = new ArrayList();
                    registro.add(rs.getString(1));
                    registro.add(rs.getString(2));
                    registro.add(rs.getString(3));
                    registro.add(rs.getString(4));
                    registro.add(rs.getString(5));
                    registro.add(rs.getString(6));
                    registro.add(rs.getString(7));
                    registro.add(rs.getString(8));
                    registro.add(rs.getString(9));
                    registro.add(rs.getString(10));
                    registro.add(rs.getString(11));
                    registro.add(rs.getString(12));
                    registro.add(rs.getString(13));
                    registro.add(rs.getString(14));
                    registro.add(rs.getString(15));
                    registro.add(rs.getString(16));
                    registro.add(rs.getString(17));
                    registro.add(rs.getString(18));
                    v.add(registro);
                    rs.next();
                }
            }

            try {
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            return v;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return v;

    }

    public int cargarCodigo() {
        int codigo = 1;
        try {
            co.Conectar();
            rs = co.Consultar("select MAX(idPaciente)+1 from PACIENTE");
            rs.first();
            if (rs.getString(1) != null) {
                codigo = Integer.parseInt(rs.getString(1));
            }
            try {
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            return codigo;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigo;

    }

    public boolean cambiarActivo(int codigo) {
        boolean respuesta = false;

        String query = "UPDATE `paciente` SET `activoPaciente`=0 where idPaciente='" + codigo + "'";


        System.out.println(query);
        try {
            co.Conectar();
            co.insupdel(query);
            respuesta = true;
            try {
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            return respuesta;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return respuesta;

    }

    public ArrayList<ArrayList> listarTodoNuevo(int opcion, String apellido, String nombre, String combo1, String combo2) {
        ArrayList<ArrayList> v = new ArrayList<ArrayList>();
        try {

            co.Conectar();
            switch (opcion) {
                case 0:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidos,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where " + combo1 + " like '%" + apellido + "%' and  " + combo2 + "  like '%" + nombre + "%' and per.idpersona = pac.idpersona");

                    break;
                case 1:
                    rs = co.Consultar("select pac.idPaciente,per.nombres,per.apellidos,per.dni,per.nacionalidad,per.domicilio,per.email,per.telefono,per.celular,per.fechanac,per.genero,per.idUbigeo,pac.antecedentes,pac.ocupacion,pac.recomendadopor,pac.grupo,pac.fechaingreso from PERSONA per, PACIENTE pac where (" + combo1 + " like '%" + apellido + "%' or   " + combo2 + "  like '%" + nombre + "%') and per.idpersona = pac.idpersona");
                    break;

            }

            if (rs.first()) {
                while (!rs.isAfterLast()) {
                    ArrayList registro = new ArrayList();
                    registro.add(rs.getString(1));
                    registro.add(rs.getString(2));
                    registro.add(rs.getString(3));
                    registro.add(rs.getString(4));
                    registro.add(rs.getString(5));
                    registro.add(rs.getString(6));
                    registro.add(rs.getString(7));
                    registro.add(rs.getString(8));
                    registro.add(rs.getString(9));
                    registro.add(rs.getString(10));
                    registro.add(rs.getString(11));
                    registro.add(rs.getString(12));
                    registro.add(rs.getString(13));
                    registro.add(rs.getString(14));
                    registro.add(rs.getString(15));
                    registro.add(rs.getString(16));
                    registro.add(rs.getString(17));
                    v.add(registro);
                    rs.next();
                }
            }

            try {
                co.Desconectar();
            } catch (Exception ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            return v;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return v;
    }

    public List<Map<String, Object>> traerPacientePorGenero(String fechainicio, String fechafin) {

        CallableStatement cstm = null;
        ResultSet rs = null;
        String sql = null;
        List<Map<String, Object>> pacientes =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();
            co.getCn().setAutoCommit(false);
            sql = "{call usp_paciente_traer_por_genero(?,?)}";
            cstm = co.getCn().prepareCall(sql);
            cstm.setString(1, fechainicio);
            cstm.setString(2, fechafin);
            rs = cstm.executeQuery();

            while (rs.next()) {
                Map paciente = new HashMap();
                paciente.put("Hombres", rs.getString("genero"));
                paciente.put("Mujeres", rs.getInt("cantidad"));
                pacientes.add(paciente);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }



        }
        return pacientes;

    }

    public List<Map<String, Object>> traerPacientePorGenero() {
        CallableStatement cstm = null;
        ResultSet rs = null;
        String sql = null;
        List<Map<String, Object>> pacientes =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_paciente_traer_todo_por_genero()}";
            cstm = co.getCn().prepareCall(sql);

            rs = cstm.executeQuery();

            while (rs.next()) {
                Map paciente = new HashMap();
                paciente.put("Genero", rs.getString("genero"));
                paciente.put("Cantidad", rs.getInt("cantidad"));
                pacientes.add(paciente);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }



        }
        return pacientes;
    }

    public List<Map<String, Object>> traerPacientePorUbigeoyFecha(String fechainicio, String fechafin, int idubigeo) {
        CallableStatement cstm = null;
        ResultSet rs = null;
        String sql = null;
        List<Map<String, Object>> pacientes =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_paciente_todo_ubigeo_fecha(?,?,?)}";
            cstm = co.getCn().prepareCall(sql);
            cstm.setString(1, fechainicio);
            cstm.setString(2, fechafin);
            cstm.setInt(3, idubigeo); 
            rs = cstm.executeQuery();

            while (rs.next()) {
                Map paciente = new HashMap();
                paciente.put("Ubicacion", rs.getString("ubicacion"));
                paciente.put("Cantidad", rs.getInt("cantidad"));
                pacientes.add(paciente);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return pacientes;        
    }

    public List<Map<String, Object>> traerPacientePorUbigeoyFecha() {
        CallableStatement cstm = null;
        ResultSet rs = null;
        String sql = null;
        List<Map<String, Object>> pacientes =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_paciente_todo_ubigeo()}";
            cstm = co.getCn().prepareCall(sql);        
           
            rs = cstm.executeQuery();
            while (rs.next()) {
                System.out.println("entroooo");
                Map paciente = new HashMap();
                paciente.put("Ubicacion", rs.getString("ubicacion"));
                paciente.put("Cantidad", rs.getInt("cantidad"));
                pacientes.add(paciente);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return pacientes;        
    }

   

   
}
